#include"aceportals.h"
using namespace std;
using namespace c3pom;

int aceportals::load()
{
	if(server_addr.set(port)==-1)//设置监听端口
		return 1;
	if(acceptor.open(server_addr,true)==-1)//开启端口复用
		return 1;

	//添加监听句柄到select中
	master_handle_set_.set_bit(acceptor().get_handle());
	acceptor().enable(ACE_NONBLOCK);
	return 0;
}

int aceportals::run(vector<string>)
{
	while(true)
	{
		if(wait_for_multiple_events()==-1)
			return -1;
		if(handle_connections()==-1)//处理活动连接
			return -1;
		if(handle_data()==-1)//读取数据
			return -1;
		if(handle_result()==-1)//处理有回执的数据
			return -1;
	}
}

int aceportals::wait_for_multiple_events()
{
	active_read_handles_=master_handle_set_;
	//获取活动句柄的范围
	int width=(int)artive_read_handles_.max_set()+1;
	return ACE::select(width,active_read_handles_);//查询并设置活动句柄集合
}

int aceportals::handle_connections()
{
	ACE_SOCK_Stream client_peer;
	while(acceptor().accept(client_peer)!=-1)
	{
		//在select的监听集合中为新连接注册标志位
		master_handle_set_.set_bit(client_peer.get_handle());
	}
	//清除（还原）接受器的标志位
	active_read_handles_.clr_bit(acceptor().get_handle());
	return 0;
}

int aceportals::handle_data()
{
	ACE_SOCK_Stream peer;
	//遍历活动标志
	ACE_Handle_Set_Iterator peer_iterator(active_read_handles_);
	for(ACE_HANDLE handle;(handle=peer_iterator())!=ACE_INVALID_HANDLE;)
	{
		peer.set_handle(handle);//设置会话句柄
		/*
		 *
		 *读取数据并放置到对应的portal中
		 *
		 *
		 */
	}
	return 0;
}

int aceportals::handle_result()
{
	PortalBlock* portalBlock=NULL;
	ACE_SOCK_Stream peer;
	while(portal.dataLength()==0)//将portal中所有的数据处理完毕
	{
		portal>>portalBlock;
		if(pbs[portalBlock]==NULL)//会话关闭或者无效,处理结果丢弃
			continue;
		peer.set_handle(pbs[portalBLock]);//设置会话
		peer.send_v();//发回结果
	}
	return 0;
}

ACE_SOCK_Aceeptor& aceportals::acceptor()
{
	return acceptor_;
}

Portal* getPortal(std::string name)
{
	if(pbs[name]==NULL)
		pbs[name]=PortalManager::getInstance()->findPortal(name);
	return pbs[name];
}
